package com.lagou.rpc.consumer.controller;

import com.lagou.rpc.api.IUserService;
import com.lagou.rpc.consumer.proxy.RpcClientProxy;
import com.lagou.rpc.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description: TODO
 * @Author 50705 2021/11/6
 *
 * 编程题一：
 *
 *   在基于Netty的自定义RPC的案例基础上，进行改造。基于Zookeeper实现简易版服务的注册与发现机制
 *
 * 要求完成改造版本：
 *
 * 1. 启动2个服务端，可以将IP及端口信息自动注册到Zookeeper
 *
 * 2. 客户端启动时，从Zookeeper中获取所有服务提供端节点信息，客户端与每一个服务端都建立连接
 *
 * 3. 某个服务端下线后，Zookeeper注册列表会自动剔除下线的服务端节点，客户端与下线的服务端断开连接
 *
 * 4. 服务端重新上线，客户端能感知到，并且与重新上线的服务端重新建立连接
 *
 * 编程题二：
 *
 *   在“编程题一”的基础上，实现基于Zookeeper的简易版负载均衡策略
 *
 * 要求完成改造版本：
 *
 * Zookeeper记录每个服务端的最后一次响应时间，有效时间为5秒，5s内如果该服务端没有新的请求，响应时间清零或失效。
 *
 * 当客户端发起调用，每次都选择最后一次响应时间短的服务端进行服务调用，如果时间一致，随机选取一个服务端进行调用，从而实现负载均衡
 *
 *
 *
 * 实现步骤：
 *
 * 1.服务端启动后链接zk，创建临时节点。创建接口，接口里结束zk的session，节点被删除
 *
 * 2.客服端启动去找zk下的服务节点，与每一个都连接
 *
 * 3.客户端注册zk节点的监听事件：当节点删除或新增时，通知到客户端，断开或新增链接
 *
 * 4.客户端发起调用时先查服务端节点里保存的最后一次调用时间，取小的调用，若一致随机调用即可
 *
 *
 * 问题：
 *
 * 1.原demo里，接口每次请求都创建一个代理类。此时每次请求都创建rpcClient，保存客户端服务端连接没用。
 *      应改为只创建一次，每次请求进来调用方法时，在代理方法里根据zk节点（性能时间）选则用哪一个
 *
 * 2.每次请求用同一个rpcClient有问题，只有第一次能成功，后续无法返回
 **/

@RestController
@RequestMapping(value = "/rpc")
public class RPCController {


    @Bean
    public IUserService createProxy1(){
        return (IUserService) RpcClientProxy.createProxy1(IUserService.class, null, 0);
    }

    @Autowired
    IUserService userService;

    @GetMapping("/getUser")
    public User getUserById(int id){

//        IUserService userService = (IUserService) RpcClientProxy.createProxy(IUserService.class, server1Ip, server1Port);
//        IUserService userService = (IUserService) RpcClientProxy.createProxy1(IUserService.class, null, 0);
        User user = userService.getById(id);
        return user;
    }
//
//    @GetMapping("/getUser")
//    public User getUserById(int id){
//
//        server++;
//
//        // 判断使用哪个服务
//        String serverIp;
//        int serverPort;
//        if(server%2 == 0){
//            serverIp = server1Ip;
//            serverPort = server1Port;
//        }else {
//            serverIp = server2Ip;
//            serverPort = server2Port;
//        }
//
//        IUserService userService = (IUserService) RpcClientProxy.createProxy1(IUserService.class, serverIp, serverPort);
//        User user = userService.getById(id);
//
//        return user;
//    }

}
